#include <stdio.h>
#include <stdlib.h>

const int MAX_PLACES = 100;
const int MAX_ROADS = 10000;
const int MAX_TIME = 2147483647;

/********************************************************************************
 * Problema da disciplina de Estrutura de Dados e Complexidade de Algoritmos da *
 * Pos Graduacao do Periodo 2011.1                                              *
 *                                                                              *
 * @see http://br.spoj.pl/problems/ENGARRAF/                                    *
 * @author Elenilson Vieira - 111100371 - elenilson[at]elenilsonvieira.com      *
 * @since 30 de junho de 2011                                                   *
 ********************************************************************************/
int main(int argc, char** argv) {

    int placesAmouont = 0;
    int roadsAmouont = 0;
    int graph[MAX_PLACES][MAX_PLACES];
    int alreadyVisitedPlace[MAX_PLACES];
    int timeFromPlaceIToOtherPlaces[MAX_PLACES];
    int i = 0, j = 0, k = 0;
    int placeI = 0, placeJ = 0, timeIJ = 0;

    while(scanf("%d %d", &placesAmouont, &roadsAmouont) && placesAmouont != 0 || roadsAmouont != 0){
        /*** Inicia o array de tempos ***/
        for(i = 0; i < placesAmouont; i++)
            for(j = 0; j < placesAmouont; j++)
                graph[i][j] = -1;

        /*** Ler as ruas e os tempos ***/
        for(i = 0; i < roadsAmouont; i++){
            scanf("%d %d %d", &placeI, &placeJ, &timeIJ);
            graph[placeI - 1][placeJ - 1] = timeIJ;
        }

        /*** Ler os locais origem e destino ***/
        timeIJ = -1;
        scanf("%d %d", &placeI, &placeJ);

        /*** Faz os calculos com Dijkstra ***/
        for (i = 0; i < placesAmouont; i++) {
           timeFromPlaceIToOtherPlaces[i] = MAX_TIME;
           alreadyVisitedPlace[i] = 0;
        }

        timeFromPlaceIToOtherPlaces[placeI - 1] = 0;
        
        for (j = 0; j < placesAmouont; j++) {
            k = -1;

            for (i = 0; i < placesAmouont; i++){
                if (!alreadyVisitedPlace[i] && ((k == -1) || (timeFromPlaceIToOtherPlaces[i] < timeFromPlaceIToOtherPlaces[k])))
                    k = i;
            }

            alreadyVisitedPlace[k] = 1;

            for (i = 0; i < placesAmouont; i++){
                if (graph[k][i]){
                    if (timeFromPlaceIToOtherPlaces[k] + graph[k][i] < timeFromPlaceIToOtherPlaces[i])
                        timeFromPlaceIToOtherPlaces[i] = timeFromPlaceIToOtherPlaces[k] + graph[k][i];
                }
            }
        }

        if(timeFromPlaceIToOtherPlaces[placeJ - 1] != MAX_ROADS)
            timeIJ = timeFromPlaceIToOtherPlaces[placeJ - 1];

        /*** Imprime o resultado ***/
        printf("%d\n", timeIJ);
    }

    return (EXIT_SUCCESS);
}